package com.store.controller.pdf;

import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.spire.pdf.PdfBorders;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPaddings;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.graphics.*;
import com.spire.pdf.grid.PdfGrid;

import java.awt.*;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class CreatePdfDocumentInJava {
    //设置线条位置和宽度
    static float x = 10;
    static float y = 30;
    static float width = 700;

    public static void main(String[] args) throws FileNotFoundException, IOException {
        DocBean docBean = new DocBean();
        docBean.setAge("12");
        docBean.setGender("男");
        docBean.setHeight("1.70m");
        docBean.setWeight("120 kg");
        docBean.setName("zxs");
        docBean.setYao("23");
        docBean.setDepartName("心内科");
        docBean.setOutNo("z101");
        docBean.setInNo("in203");
        docBean.setBingQu("东区");
        docBean.setBedNo("B220");

        //创建PdfDocument对象
        PdfDocument doc = new PdfDocument();

        //添加一页
        PdfPageBase page = doc.getPages().add();

        PdfPageBase page1 = doc.getPages().add();

        //标题文字
        String title = "心肺运动试验报告";

        //创建单色画刷对象
        PdfSolidBrush brush1 = new PdfSolidBrush(new PdfRGBColor(Color.BLACK));
        PdfSolidBrush brush2 = new PdfSolidBrush(new PdfRGBColor(Color.BLACK));

        //创建TrueType字体对象
        PdfTrueTypeFont font1 = new PdfTrueTypeFont(new Font("Arial Unicode MS", Font.PLAIN, 14), true);
        PdfTrueTypeFont font2 = new PdfTrueTypeFont(new Font("Arial Unicode MS", Font.PLAIN, 10), true);

        //创建PdfStringFormat对象
        PdfStringFormat format1 = new PdfStringFormat();
        format1.setAlignment(PdfTextAlignment.Center);//设置文字居中

        //使用drawString方法绘制标题文字
        page.getCanvas().drawString(title, font1, brush1, new Point2D.Float((float) page.getActualBounds(true).getWidth() / 2, 0), format1);

        PdfPen pen1 = new PdfPen(new PdfRGBColor(Color.BLACK), 1f);
        page.getCanvas().drawLine(pen1, x, y, x + width, y);

        //创建画刷
        PdfSolidBrush brush = new PdfSolidBrush(new PdfRGBColor(Color.black));
        //创建CJK字体
        PdfCjkStandardFont cjkFont = new PdfCjkStandardFont(PdfCjkFontFamily.Sino_Type_Song_Light, 10f);

//        StringFormatBean formatBean = new StringFormatBean("姓名：", docBean.getName(), cjkFont, brush, 10, y + 10, PdfTextAlignment.Left);

        String petXXTempData = "{\"patientName\":\"张三\",\"gender\":\"男\",\"age\":\"20\",\"height\":\"170\",\"weight\":\"65\",\"waistline\":\"30\",\"deptName\":\"心内科12\",\"inNo\":\"21\",\"outNo\":\"21\",\"diagnosis\":\"：心肺运动试验报告  姓名：zhang性别：男年龄：22 岁 身高：180 cm体重：65 kg腰围：23 cm 科别：心内科住院号：门诊号：23 病区：323123床位：2133 临床诊断： ssdfs大师傅似的大师傅士大夫 试验前用药： 的发射点发射点 既往史： 大师傅士大夫撒旦 家族史： 打发士大夫士大夫 运动处方： <3METS  日常生活活动:洗漱、剃须、穿衣、案头工作、洗盘子、轻家务、开车、职业相关活动:端坐（办公室）、打字/案头工作、站立（店员）、休闲活动:高尔夫（乘车）、编织、手工缝纫、体育锻炼方法:固定自行车、很轻松的健美操 概述  运动方案：脚踏车试验 23 W/minBorg评分：18 分热身时间：3min 功率递增总时间：23终止原因：下肢疲劳 心电图  静息：正常窦性心律 运动前：同静息心电图 运动中：未见明显ST-T改变 运动后：未见明显ST-T改变 静态肺功能  测试指标        实测值        达预计百分比(%) 一秒肺活量FEV1(I)                 用力肺活量FVCex(I)                 一秒率FEV1/FVCex(%)                 最大通气量MVV(l/min)                 静息呼吸熵RER                — 地址：福建省厦门市湖里区金山路2999号24小时心脏热线：0592-968120 此报告仅供临床参考，不作法律依据。扫码关注，在线查询报告。   心肺运动试验报告  运动肺功能  测试指标        无氧阈        峰值        达预计百分比(%)        标准值 功率Watt(w)                        %        - 摄氧量VO2(I/min)                        %        - 公斤摄氧量VO2/kg(mI/min/kg)                        %        - 代谢当量METs                        %        - 呼吸交换率RER                        -        - 心率HR(1/min)                        %        - 分钟通气量VE(I/min)                        %        - 血氧饱和度SPO2(%)                        %        - 呼吸频率BF(1/min)                        -        - 呼吸储备BR(%)                        -        - 氧脉O2Pulse(ml/beat)                        %        ＞80% 预测值 潮气末CO2分压PETCO2(mmHg)                        -        - 死腔量/潮气量VD/VT                        -        - VE/VCO2 Slope                - △VO2/△WR                ＞8.29ml/w/min 试验结论  静态肺功能： 无异常 心电图踏车试验：阳性 心率储备：异常，最大心率未达到预计值的85% 呼吸储备：无异常 最大摄氧量：偏低 氧脉搏：偏低 VO2/WR：无异常 是否达到无氧阈：未达 总体评价： 2大师傅士大夫撒旦士f 2大师傅士大夫撒旦士f 无法为发我为凤尾 范围发二分违法我访问发违法为凤尾大夫 而无法 违法 服务二分 范围f2大师傅士大夫撒旦士f 无法为发我为凤尾 范围发二分违法我访问发违法为凤尾大夫 而无法 违法 服务二分 范围f2大师傅士大夫撒旦士f 无法为发我为凤尾 范围发二分违法我访问发违法为凤尾大夫 而无法 违法 服务二分 范围f无法为发我为凤尾 范围发二分违法我访问发违法为凤尾大夫 而无法 违法 服务二分 范围f 测试人员：康复中心,徐亚伟,刘伟静报告日期：2020-08-14 14:11:07 执行科室：心脏康复中心审核医生：测试 地址：福建省厦门市湖里区金山路2999号24小时心脏热线：0592-968120 此报告仅供临床参考，不作法律依据。扫码关注，在线查询报告。\",\"sport\":\"23\",\"planLabel\":\"34234\",\"watt\":\"324\",\"brog\":\"324\",\"warm_up_time\":\"324\",\"increa_time\":\"324\",\"stop_reason\":\"342\",\"resting\":\"342\",\"rest_ecg\":\"34\",\"exercise\":\"34\",\"after_exercise\":\"34\",\"actual_fev1\":\"324\",\"fev1_percent\":\"342\",\"actual_fvcex\":\"342\",\"fvcex_percent\":\"342\",\"actual_fev1_fvcex\":\"342\",\"fev1_fvcex_percent\":\"324\",\"actual_mvv\":\"342\",\"mvv_percent\":\"34\",\"actual_rer\":\"342\",\"anaerobic_threshold_watt\":\"342\",\"peak_watt\":\"324\",\"per_watt\":\"342\",\"anaerobic_threshold_max_oxy\":\"342\",\"peak_max_oxy\":\"342\",\"per_max_oxy\":\"234\",\"anaerobic_threshold_kiol_oxy\":\"324\",\"peak_kiol_oxy\":\"342\",\"per_kiol_oxy\":\"342\",\"anaerobic_threshold_mets\":\"324\",\"peak_mets\":\"324\",\"per_mets\":\"342\",\"anaerobic_threshold_hr\":\"342\",\"peak_hr\":\"432\",\"per_hr\":\"342\",\"anaerobic_threshold_rer\":\"432\",\"peak_rer\":\"324\",\"per_rer\":\"342\",\"anaerobic_threshold_ve\":\"342\",\"peak_ve\":\"324\",\"per_ve\":\"342\",\"anaerobic_threshold_spo2\":\"342\",\"peak_spo2\":\"324\",\"per_spo2\":\"324\",\"anaerobic_threshold_br\":\"324\",\"peak_br\":\"\",\"anaerobic_threshold_bf\":\"324\",\"peak_bf\":\"342\",\"O2Pulse_at\":\"324\",\"O2Pulse_end\":\"342\",\"O2Pulse_pre\":\"342\",\"PETCO2_at\":\"342\",\"PETCO2_end\":\"342\",\"VD_VT_at\":\"342\",\"VD_VT_end\":\"342\",\"VE_VCO2\":\"324\",\"vo2_wr\":\"342\",\"staticLungLabel\":\"342\",\"ecg_result_label\":\"2大师傅士大夫撒旦士f 2大师傅士大夫撒旦士\",\"hrr_result_label\":\"2大师傅士大夫撒旦士f 2大师傅士大夫撒旦士\",\"br_result_label\":\"2大师傅士大夫撒旦士f 2大师傅士大夫撒旦士\",\"mo_result_label\":\"2大师傅士大夫撒旦士f 2大师傅士大夫撒旦士\",\"op_result_label\":\"2大师傅士大夫撒旦士f 2大师傅士大夫撒旦士\",\"vo2_wr_result_label\":\"2大师傅士大夫撒旦士f 2大师傅士大夫撒旦士\",\"at_result_label\":\"2大师傅士大夫撒旦士f 2大师傅士大夫撒旦士\",\"overall_assessment\":\"：\",\"execDocName\":\"342\",\"execDate\":\"342\",\"verifyUserName\":\"342\",\"wardNo\":\"342\",\"bedNo\":\"342\",\"departName\":\"342\"}";

        JSONObject array = JSONObject.parseObject(petXXTempData);
        Iterator<Map.Entry<String, Object>> it = array.entrySet().iterator();
        int count = 1;
        while (it.hasNext()) {
            Map.Entry<String, Object> entry = it.next();
            PdfStringFormat leftAlignment = new PdfStringFormat(PdfTextAlignment.Left);
            if (entry.getKey().equals("diagnosis")) {

                page1.getCanvas().drawString(entry.getKey() + "：" + entry.getValue(), cjkFont, brush, 10, (count * 20) + y + 10, leftAlignment);
            } else {
                page.getCanvas().drawString(entry.getKey() + "：" + entry.getValue(), cjkFont, brush, 10, (count * 20) + y + 10, leftAlignment);
            }
            count++;
        }


     /*   //使用PdfStringFormat创建左对齐
        PdfStringFormat leftAlignment = new PdfStringFormat(PdfTextAlignment.Left);
        page.getCanvas().drawString("姓名：" + docBean.getName(), cjkFont, brush, 10, y + 10, leftAlignment);

        PdfStringFormat rightAlignment = new PdfStringFormat(PdfTextAlignment.Right);
        page.getCanvas().drawString("年龄：" + docBean.getAge(), cjkFont, brush, page.getCanvas().getClientSize().getWidth() - 25, y + 10, rightAlignment);

        PdfStringFormat centerAlignment = new PdfStringFormat(PdfTextAlignment.Center);
        page.getCanvas().drawString("性别：" + docBean.getGender(), cjkFont, brush, page.getCanvas().getClientSize().getWidth() / 2, y + 10, centerAlignment);

        PdfStringFormat heightAlignment = new PdfStringFormat(PdfTextAlignment.Left);
        page.getCanvas().drawString("身高：" + docBean.getAge(), cjkFont, brush, 10, y + 25, heightAlignment);

        PdfStringFormat weightAlignment = new PdfStringFormat(PdfTextAlignment.Center);
        page.getCanvas().drawString("体重：" + docBean.getWeight(), cjkFont, brush, page.getCanvas().getClientSize().getWidth() / 2 + 10, y + 25, weightAlignment);

        PdfStringFormat yaoAlignment = new PdfStringFormat(PdfTextAlignment.Right);
        page.getCanvas().drawString("腰围：" + docBean.getYao(), cjkFont, brush, page.getCanvas().getClientSize().getWidth() - 25, y + 25, yaoAlignment);

        PdfStringFormat departAlignment = new PdfStringFormat(PdfTextAlignment.Left);
        page.getCanvas().drawString("科别：" + docBean.getDepartName(), cjkFont, brush, 10, y + 40, departAlignment);

        PdfStringFormat outAlignment = new PdfStringFormat(PdfTextAlignment.Center);
        page.getCanvas().drawString("住院号：" + docBean.getOutNo(), cjkFont, brush, page.getCanvas().getClientSize().getWidth() / 2 + 10, y + 40, outAlignment);

        PdfStringFormat inAlignment = new PdfStringFormat(PdfTextAlignment.Right);
        page.getCanvas().drawString("门诊号：" + docBean.getInNo(), cjkFont, brush, page.getCanvas().getClientSize().getWidth(), y + 40, inAlignment);

        PdfStringFormat bingAlignment = new PdfStringFormat(PdfTextAlignment.Left);
        page.getCanvas().drawString("病区：" + docBean.getBingQu(), cjkFont, brush, 10, y + 55, bingAlignment);

        PdfStringFormat bedAlignment = new PdfStringFormat(PdfTextAlignment.Center);
        page.getCanvas().drawString("床位号：" + docBean.getBedNo(), cjkFont, brush, page.getCanvas().getClientSize().getWidth() / 2 + 10, y + 55, bedAlignment);*/

        PdfPen pen2 = new PdfPen(new PdfRGBColor(Color.BLACK), 1f);
        page.getCanvas().drawLine(pen2, x, y + 85, x + width, y + 85);

        PdfGrid grid = getPdfGrid();
        //从txt文件读取内容到字符串
        // String body = readFileToString("/home/zhangxs/Desktop/user");

        //创建PdfStringFormat对象
        PdfStringFormat format2 = new PdfStringFormat();
        format2.setParagraphIndent(20);//设置段首缩进

        //创建Rectangle2D对象
        Rectangle2D.Float rect = new Rectangle2D.Float(0, 30, (float) page.getActualBounds(true).getWidth(), (float) page.getActualBounds(true).getHeight());

        //使用drawString方法在矩形区域绘制主体文字
        page.getCanvas().drawString("", font2, brush2, rect, format2);

        page.getCanvas().drawImage(getImage(), 10, 0, 150, 25);

        //绘制表格到PDF
        // grid.draw(page, 10, y + 190);


        //保存到PDF文档
        doc.saveToFile("ouput.pdf");
    }

    private List<PdfStringFormat> getPdfStringFormatList() {
        List<PdfStringFormat> pdfStringFormats = Lists.newArrayList();

        return pdfStringFormats;
    }

    private static PdfGrid getPdfGrid() {
        //创建PdfGrid对象
        PdfGrid grid = new PdfGrid();

        //设置单元格内边距、默认字体、字体颜色和默认背景色
        grid.getStyle().setCellPadding(new PdfPaddings(3, 3, 3, 3));
        grid.getStyle().setFont(new PdfTrueTypeFont(new Font("宋体", Font.PLAIN, 200), true));
        grid.getStyle().setTextBrush(PdfBrushes.getBlack());
        grid.getStyle().setBackgroundBrush(PdfBrushes.getWhite());

        //创建PdfBorders对象，并设置颜色及粗细
        PdfBorders borders = new PdfBorders();
        borders.setAll(new PdfPen(PdfBrushes.getBlack(), 1f));

        //定义数据
        String[] data = {
                "测试指标;实测值;达预计百分比(%)",
                "一秒肺活量FEV1(I);-;-",
                "用力肺活量FVCex(I);-;-",
                "一秒率FEV1/FVCex(%);-;-",
                "最大通气量MVV(1/min);-;-",
                "静吸呼吸RER;-;-",
        };
        String[][] dataSource = new String[data.length][];
        for (int i = 0; i < data.length; i++) {
            dataSource[i] = data[i].split("[;]", -1);
        }

        //填充数据到表格
        grid.setDataSource(dataSource);

       /* //在表格最后一列填充图片
        grid.getRows().get(1).getCells().get(4).getStyle().setBackgroundImage(PdfImage.fromFile("F:\\Documents\\flags\\flag-of-China.png"));
        grid.getRows().get(2).getCells().get(4).getStyle().setBackgroundImage(PdfImage.fromFile("F:\\Documents\\flags\\flag-of-Japan.png"));
        grid.getRows().get(3).getCells().get(4).getStyle().setBackgroundImage(PdfImage.fromFile("F:\\Documents\\flags\\flag-of-United-Kingdom.png"));
        grid.getRows().get(4).getCells().get(4).getStyle().setBackgroundImage(PdfImage.fromFile("F:\\Documents\\flags\\flag-of-Germany.png"));
        grid.getRows().get(5).getCells().get(4).getStyle().setBackgroundImage(PdfImage.fromFile("F:\\Documents\\flags\\flag-of-Canada.png"));
        grid.getRows().get(6).getCells().get(4).getStyle().setBackgroundImage(PdfImage.fromFile("F:\\Documents\\flags\\flag-of-United-States-of-America.png"));*/

        //设置最后一列列宽
        // grid.getColumns().get(grid.getColumns().getCount()-1).setWidth(60f);

      /*  //纵向合并单元格
        grid.getRows().get(1).getCells().get(0).setRowSpan(2);
        grid.getRows().get(3).getCells().get(0).setRowSpan(2);
        grid.getRows().get(5).getCells().get(0).setRowSpan(2);*/

        for (int i = 0; i < data.length; i++) {

            //设置每一行的高度
            grid.getRows().get(i).setHeight(15f);
            //设置第一列的背景色
            grid.getRows().get(i).getCells().get(0).getStyle().setBackgroundBrush(PdfBrushes.getWhite());
            //设置第一列的字体
            grid.getRows().get(i).getCells().get(0).getStyle().setFont(new PdfTrueTypeFont(new Font("Arial Unicode MS", Font.PLAIN, 6), true));

            for (int j = 0; j < grid.getColumns().getCount(); j++) {

                //设置所有单元格的边框样式
                grid.getRows().get(i).getCells().get(j).getStyle().setBorders(borders);
                //设置所有单元格内的文字对齐方式
                grid.getRows().get(i).getCells().get(j).setStringFormat(new PdfStringFormat(PdfTextAlignment.Center, PdfVerticalAlignment.Middle));
                //设置第一行的字体
                grid.getRows().get(0).getCells().get(j).getStyle().setFont(new PdfTrueTypeFont(new Font("Arial Unicode MS", Font.PLAIN, 6), true));
                //设置第一行的背景色
                grid.getRows().get(0).getCells().get(j).getStyle().setBackgroundBrush(PdfBrushes.getWhite());

            }
        }
        return grid;
    }

    public static PdfImage getImage() {
        //加载图片，并获取图片高宽
        PdfImage image = PdfImage.fromFile("/home/workspace/nacos_demo/xxlogo.png");
        return image;
    }

}
